home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2001 / MacHack 2001.toast / pc / The Hacks / Palm Finder 2 / Src / Views / menu_bar.cpp < prev    next >
Encoding:
Text File  |  2001-06-23  |  4.2 KB  |  162 lines

  1. // menu_bar.cpp
  2.  
  3. // still have a bug where click in menu bar outside a menu is interpreted
  4. // as opening a menu, so superclock doesn't get clicks in this situation
  5.  
  6. // includes
  7. #include "menu_bar.h"
  8. #include "menu.h"
  9. #include "Finder_res.h"
  10. #include "app_constants.h"
  11.  
  12. // constants
  13. const int top_margin = 1;
  14. const int left_margin = 2;
  15. const int menu_spacing = 0;
  16. const int click_time = 30; // ticks
  17.  
  18. //
  19. // constructor
  20. //
  21. menu_bar::menu_bar(FormGadgetType* gadgetP, view* in_superview): 
  22.     view(&gadgetP->rect, in_superview)
  23. {
  24.     m_open = false;
  25.     
  26.     int x = m_bounds.topLeft.x + left_margin;
  27.     int y = m_bounds.topLeft.y;
  28.     int height = m_bounds.extent.y - 1;
  29.     int baseline = FntBaseLine() + top_margin;
  30.     menu*    new_menu;
  31.     
  32.     // should load menu bar resource, create menus based on it
  33.     // for now, just load static menus
  34.     new_menu = new menu(NULL, AppleBitmap, x, y, baseline, height, this);
  35.     new_menu->add_item("About the Finder", cmd_about, 0);
  36.     new_menu->add_item("-", 0, 0);
  37.     new_menu->add_item("Alarm Clock",         cmd_alarm_clock, 0);
  38.     new_menu->add_item("Calculator",             cmd_calculator, 0);
  39.     new_menu->add_item("Chooser",             cmd_chooser, 0);
  40.     new_menu->add_item("Control Panel",     cmd_control_panel, 0);
  41.     new_menu->add_item("Key Caps",             cmd_key_caps, 0);
  42.     new_menu->add_item("Note Pad",             cmd_note_pad, 0);
  43.     new_menu->add_item("Scrapbook",             cmd_scrapbook, 0);
  44.     x += new_menu->get_width() + menu_spacing;
  45.  
  46.     new_menu = new menu("File", 0, x, y, baseline, height, this);
  47.     new_menu->add_item("New Folder",     cmd_new_folder, 'N');
  48.     new_menu->add_item("Open",             cmd_open, 'O');
  49.     new_menu->add_item("Print",             cmd_print, 'P');
  50.     new_menu->add_item("Close Window", cmd_close_window, 'W');
  51.     new_menu->add_item("-",                     0, 0);
  52.     new_menu->add_item("Get Info",         cmd_get_info, 'I');
  53.     new_menu->add_item("Duplicate",         cmd_duplicate, 'D');
  54.     x += new_menu->get_width() + menu_spacing;
  55.  
  56.     new_menu = new menu("Edit", 0, x, y, baseline, height, this);
  57.     new_menu->add_item("Undo",             cmd_undo, 'Z');
  58.     new_menu->add_item("-",                     0, 0);
  59.     new_menu->add_item("Cut",                 cmd_cut, 'X');
  60.     new_menu->add_item("Copy",             cmd_copy, 'C');
  61.     new_menu->add_item("Paste",             cmd_paste, 'V');
  62.     new_menu->add_item("Clear",             cmd_clear, 0);
  63.     new_menu->add_item("-",                     0, 0);
  64.     new_menu->add_item("Show Clipboard", cmd_show_clipboard, 0);
  65.     x += new_menu->get_width() + menu_spacing;
  66.  
  67.     new_menu = new menu("View", 0, x, y, baseline, height, this);
  68.     x += new_menu->get_width() + menu_spacing;
  69.     new_menu->add_item("as Small Icons",     cmd_view_as_sm_icon, 0);
  70.     new_menu->add_item("as Icons",             cmd_view_as_icon, 0);
  71.     new_menu->add_item("as List",                 cmd_view_as_list, 0);
  72.  
  73.     new_menu = new menu("Special", 0, x, y, baseline, height, this);
  74.     x += new_menu->get_width() + menu_spacing;
  75.     new_menu->add_item("Empty Trash",     cmd_empty_trash, 0);
  76.     new_menu->add_item("-",                     0, 0);
  77.     new_menu->add_item("Sleep",             cmd_sleep, 0);
  78.     new_menu->add_item("Restart",             cmd_restart, 0);
  79.     new_menu->add_item("Shut Down",     cmd_shutdown, 0);
  80. }
  81.  
  82. //
  83. // destructor
  84. //
  85. menu_bar::~menu_bar() {
  86.     // do nothing
  87. }
  88.  
  89. //
  90. // click()
  91. //
  92. // override here in order to catch pen clicks when menu is open
  93. Boolean    
  94. menu_bar::click(int x, int y) {
  95.     Boolean handled = false;
  96.     
  97.     if (m_open==false) {
  98.         handled = view::click (x, y);
  99.     } else {
  100.         handled = click_self (x, y);
  101.     }
  102.     
  103.     return handled;
  104. }
  105.  
  106.  
  107. #pragma mark -
  108.  
  109. //
  110. // draw_self()
  111. //
  112. void
  113. menu_bar::draw_self() {
  114.     RectangleType r;
  115.     PointType start, end;
  116.     
  117.     // set up rect
  118.     RctCopyRectangle (&m_bounds, &r);
  119.     r.extent.y--;
  120.     
  121.     // erase rect
  122.     WinEraseRectangle (&r, 0);
  123.     
  124.     // set up line
  125.     start.x = r.topLeft.x;
  126.     start.y = r.topLeft.y + r.extent.y;
  127.     end.x = start.x + r.extent.x;
  128.     end.y = start.y;
  129.     
  130.     // draw line
  131.     WinDrawLine (start.x, start.y, end.x, end.y);
  132. }
  133.  
  134. //
  135. // click_self()
  136. //
  137. Boolean
  138. menu_bar::click_self(int x, int y) {
  139.     Boolean    pen_down;
  140.     short        new_x, new_y;
  141.     UInt32    now = TimGetTicks();
  142.     UInt32    timer = now + click_time;
  143.     
  144.     EvtGetPen ( &new_x, &new_y, &pen_down );
  145.     while (pen_down==true) {
  146.         still_down(new_x, new_y);
  147.         EvtGetPen ( &new_x, &new_y, &pen_down );
  148.     }
  149.     
  150.     // keep menu open for short pen taps
  151.     now = TimGetTicks();
  152.     if ( (now < timer) && RctPtInRectangle( new_x, new_y, &m_bounds ) ) {
  153.         m_open = true;
  154.     } else {
  155.         pen_up(new_x, new_y);
  156.         m_open = false;
  157.     }
  158.     
  159.     return true;
  160. }
  161.  
  162.